package com.bdf.ipharma.config;

import java.sql.Connection;
import java.util.Date;
import java.util.Hashtable;

import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.time.DateUtils;
import org.apache.log4j.Logger;

import com.bdf.ipharma.gui.GUIHeaderComponent;
import com.bdf.ipharma.gui.Texts;
import com.bdf.ipharma.model.Usuario;
import com.bdf.ipharma.starter.McdPrs;

/**
 * Replica la funcionalidad de la session de Http. Es un almacenamiento de
 * datos. Se setean valores que tienen sentido que perduren a lo largo de toda
 * la ejecucion del sistema.
 * 
 * @author jmazzetti
 */

public class Session extends Hashtable {

	/**
	 * Constructor
	 */
	public Session() {

	}

	private Date tiempoUltimaActividad;

	static final Logger logger = Logger.getLogger(GUIHeaderComponent.class);

	/**
	 * Retorna el objecto usuario
	 * 
	 * @return Usuario
	 */
	public Usuario getUsuario() {
		return (Usuario) this.get(McdPrs.aUser);
	}

	/**
	 * Guarda un objeto de tipo usuario (el usuario que se logueo)
	 * 
	 * @param usuario
	 */
	public void setUsuario(Usuario usuario) {
		this.put(McdPrs.aUser, usuario);
	}

	/**
	 * Returns the actual db connection
	 * 
	 * @return a Connection object
	 */
	public Connection getConn() {

		return (Connection) this.get(McdPrs.aConnection);
	}

	/**
	 * Returns the specified property as a string
	 * 
	 * @return a String property
	 */
	public String getString(String pProp) {

		return (String) this.get(pProp);
	}

	/**
	 * Returns the specified property as a string
	 * 
	 * @return a String property
	 */
	public long getLong(String pProp) {

		return Long.parseLong((String) this.get(pProp));
	}

	public static final String MEDICAMENTO_BTN_SELECTED = "MedicamentoSeleccionado";
	public static final String LISTA_LOTES_BTN_SELECTED = "LotesMedicamentoSeleccionado";
	public static final String LOTES_VENCIMIENTO_BTN_SELECTED = "LotesVencimientoSeleccionado";
	public static final String PROD_DISPENSER_REPOSICION = "ProdDispenserReposicion";
	public static final String DISPENSER_PROPERTIES = "DispenserProperties";
	public static final String LISTA_EXTRACCION = "listaExtraccionSelectAllProductos";
	public static final String USUARIO_SESSION = "usuarioSession";

	public void disposeSession() {
		this.remove(McdPrs.aUser);
		this.remove(Texts.MEDICAMENTO_BTN_SELECTED);
		this.remove(Texts.LISTA_LOTES_BTN_SELECTED);
		this.remove(Texts.LOTES_VENCIMIENTO_BTN_SELECTED);
		this.remove(Texts.PROD_DISPENSER_REPOSICION);
		this.remove(Texts.DISPENSER_PROPERTIES);
		this.remove(Texts.LISTA_EXTRACCION);
		this.remove(Texts.USUARIO_SESSION);
		this.remove(Texts.LISTA_REPOSICION);
		this.remove(McdPrs.PRODUCTOS_SELECCIONADOS);
		this.remove(McdPrs.timeout);
		logger.debug("*** OBJETOS DE SESSION REMOVIDOS***");
	}

	public void removeUser() {
		this.remove(McdPrs.aUser);
	}

	public String getPort() {
		return Config.getPropertie("serial.port.name");
	}

	// Manejo de Session.
	
	public void isTimeout(Date now) throws Exception{
		tiempoUltimaActividad = (Date) this.get(McdPrs.timeout);
		Date tiempoSessionExpirada = DateUtils.addMinutes(tiempoUltimaActividad, Integer.parseInt(StringUtils.strip(McdPrs.timeout)));
		if(now.after(tiempoSessionExpirada))
			throw new Exception(Texts.MENSAJE_SESSION_TIMEOUT);

	}
	
	public void setTimeout(Date tiempoUltimaActividad) {
		logger.debug("Tiempo de session ultima actividad: " + tiempoUltimaActividad);
		this.tiempoUltimaActividad = tiempoUltimaActividad;
		this.put(McdPrs.timeout, tiempoUltimaActividad);
	}
	
}
